其他
我有一个问题,用了多线程后,两个问题有了现在
为什么要用多线程
代价
绑核
8
小结
更快,加快处理任务 更强,同时处理多任务
难控制,编程困难 不当使用降低性能,线程切换 bug难定位,资源竞争
如何创建多线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
thread 线程ID指针,创建成功时,会保存在此 attr 线程属性,控制线程的一些行为 start_routine 线程运行起始地址,是一个函数指针 arg 函数的参数,只有一个参数,因此多个参数需要打包在一起
看到了吗,到处都有void*的身影(参考《void*是什么玩意》)。
//main.c
#include <stdio.h>
#include <pthread.h>
void *myThread(void *id)
{
printf("thread run,value is %d\n",*(int*)id);
//return NULL; 这种方式也可以退出线程
pthread_exit((void*)0);//退出线程
}
int main(void)
{
pthread_t tid ;
int i = 10;
int status = pthread_create(&tid,NULL,myThread,(void*)&i);
if(status < 0 )
{
printf("crete failed\n");
}
printf("main func finished\n");
return 0;
}
$ ./main
main func finished
如何改进呢?我们可以等线程执行完啊,于是,在主线程退出前sleep:
{
pthread_t tid ;
int i = 10;
int status = pthread_create(&tid,NULL,myThread,(void*)&i);
if(status < 0 )
{
printf("crete failed\n");
}
printf("main func finished\n");
sleep(1);
return 0;
}
#include <unistd.h>
)。thread run,value is 10
main func finished
可能会先打印。这也就呼应了文章标题。但是转念一想,如果线程执行的时间超过一秒呢,难道就要sleep更长时间吗?而很多时候甚至根本不知道线程要执行多长时间,那怎么办呢?
{
pthread_t tid ;
int i = 10;
int status = pthread_create(&tid,NULL,myThread,(void*)&i);
if(status < 0 )
{
printf("crete failed\n");
}
printf("main func finished\n");
pthread_join(tid,NULL);
return 0;
}
线程终止
线程函数返回 调用pthread_exit,主线程调用无碍 调用pthread_cancel 调用exit,或者主线程退出,所有线程终止
注意
{
pthread_t tid;
int i = 10;
int status = pthread_create(&tid,NULL,myThread,(void*)&i);
if(status < 0 )
{
printf("crete failed\n");
}
i = 6;
printf("main func finished\n");
pthread_join(tid,NULL);
return 0;
}
总结
相关精彩推荐